package bridge

import "fmt"

// 假设我们有一个消息推送系统，需要支持多种消息类型（如短信、邮件）和多种平台（如阿里云、腾讯云）。消息类型和推送平台是两个独立变化的维度。
// 为避免需要创建阿里云+短信 阿里云+邮件....组合，使用桥接模式来设计

// PushPlatform 推送平台接口
type PushPlatform interface {
	// PushMessage 推送方法
	PushMessage(message string) error
}

// AliyunPush 阿里云推送平台
type AliyunPush struct {
}

// PushMessage 推送方法
func (a *AliyunPush) PushMessage(message string) error {
	fmt.Printf("aliyun push message: %s\n", message)
	return nil
}

// TencentPush 腾讯云推送平台
type TencentPush struct {
}

// PushMessage 推送方法
func (t *TencentPush) PushMessage(message string) error {
	fmt.Printf("tencent push message: %s\n", message)
	return nil
}

// MessageSender 抽像部分：消息发送器
type MessageSender struct {
	// 推送平台
	pushPlatform PushPlatform
}

// NewMessageSender 创建消息发送器
func NewMessageSender(pushPlatform PushPlatform) *MessageSender {
	return &MessageSender{
		pushPlatform: pushPlatform,
	}
}

// Send 发送消息
func (m *MessageSender) Send(message string) error {
	// 构造消息内容
	return m.pushPlatform.PushMessage(message)
}

// SMSMessage 扩展抽象：短信消息
type SMSMessage struct {
	*MessageSender
}

// NewSMSMessage 创建短信消息
func NewSMSMessage(pushPlatform PushPlatform) *SMSMessage {
	return &SMSMessage{
		MessageSender: NewMessageSender(pushPlatform),
	}
}

// Send 发送短信
func (s *SMSMessage) Send(message string) error {
	// 构造短信内容
	return s.MessageSender.Send(message)
}

// EmailMessage 扩展抽象：邮件消息
type EmailMessage struct {
	*MessageSender
}

// NewEmailMessage 创建邮件消息
func NewEmailMessage(pushPlatform PushPlatform) *EmailMessage {
	return &EmailMessage{
		MessageSender: NewMessageSender(pushPlatform),
	}
}

// Send 发送邮件
func (e *EmailMessage) Send(message string) error {
	// 构造邮件内容
	return e.MessageSender.Send(message)
}